جزوه · فصل نهم · جلسه ۷۹ · متغیرها در خط فرمان ← بازگشت به فهرست
📘 فصل نهم · جلسه ۷۹ متغیرها در خط فرمان
📅 تاریخ: چهارشنبه، ۳ شهریور ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
این جلسه یکی از مباحث پایه‌ای و مهم در اسکریپت‌نویسی است. تفاوت متغیرهای Global و Local و نحوه استفاده از export و printenv حتماً در آزمون می‌آید.
📦 قبل از شروع، یه مثال ساده:

فرض کن یه جعبه ابزار داری که توش ابزارهای مختلف رو می‌ذاری. هر بار که می‌خوای از یه ابزار استفاده کنی، باید اون رو از جعبه برداریم. توی لینوکس، متغیرها مثل همون جعبه ابزار هستن. اطلاعات رو توی RAM ذخیره می‌کنن تا برنامه‌ها و اسکریپت‌ها بتونن بهشون دسترسی داشته باشن. این جلسه بهت یاد میده چطور با این جعبه‌ها کار کنی!

▍ متغیرها چیستند و چرا مهم هستند؟

متغیرها محل‌هایی در حافظه RAM هستند که برای ذخیره‌سازی اطلاعات استفاده می‌شوند. این اطلاعات می‌توانند شامل اعداد، رشته‌های متنی، مسیرها، تنظیمات سیستم و ... باشند. هر برنامه یا اسکریپتی می‌تواند به این متغیرها دسترسی داشته باشد و از آنها استفاده کند.

🔑 نکته کلیدی:
  • متغیرها اطلاعات را در RAM ذخیره می‌کنند.
  • این اطلاعات در طول اجرای سیستم یا اسکریپت در دسترس هستند.
  • متغیرها به برنامه‌نویسی پویا و خودکارسازی کمک می‌کنند.

▍ دو نوع اصلی متغیرها

در لینوکس، متغیرها به دو دسته اصلی تقسیم می‌شوند:

🌍 متغیرهای Global (سراسری)

  • در همه پردازش‌های فرزند (Child Processes) قابل دسترس هستند.
  • با دستور export از یک متغیر Local به Global تبدیل می‌شوند.
  • با دستور printenv یا env قابل مشاهده هستند.
  • معمولاً برای تنظیمات سیستمی و محیطی استفاده می‌شوند.
  • مثال: PATH, HOME, USER

🏠 متغیرهای Local (محلی)

  • فقط در همان شل (Shell) که تعریف شده‌اند، قابل دسترس هستند.
  • به پردازش‌های فرزند ارث‌بری (Inherit) نمی‌شوند.
  • با علامت = تعریف می‌شوند (مثل myvar="Hello").
  • با دستور printenv قابل مشاهده نیستند.
  • مثال: temp_file="/tmp/myfile.txt"
نکته امتحانی: متغیرهای Local به شل فعلی محدود هستند، اما متغیرهای Global به همه شل‌های فرزند ارث‌بری می‌شوند.

▍ تعریف متغیرها

در Bash و Zsh، متغیرها با علامت = تعریف می‌شوند. نکته: بین نام متغیر، علامت = و مقدار آن فاصله نگذارید!

┌──(ya3in㉿kali)-[~] └─$ myvar="Hello, World!" └─$ echo $myvar Hello, World!

توضیح: myvar یک متغیر Local است. با $ می‌توانیم به مقدار آن دسترسی پیدا کنیم.

⚠️ توجه: بین نام متغیر، = و مقدار آن هیچ فاصله‌ای نگذارید. myvar = "Hello" اشتباه است!

▍ متغیرهای Global با export

با استفاده از دستور export، یک متغیر Local را به Global تبدیل می‌کنیم تا در پردازش‌های فرزند نیز قابل دسترس باشد.

┌──(ya3in㉿kali)-[~] └─$ export GLOBAL_VAR="I am global" └─$ bash └─$ echo $GLOBAL_VAR I am global

توضیح: با export، متغیر GLOBAL_VAR در شل جدید (bash) نیز قابل دسترس است.

برای تبدیل یک متغیر Local به Global از export استفاده کنید.

▍ مشاهده متغیرها

printenv (نمایش متغیرهای Global)

printenv همه متغیرهای Global را نمایش می‌دهد.

┌──(ya3in㉿kali)-[~] └─$ printenv | head -5 SHELL=/bin/zsh SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1234 QT_ACCESSIBILITY=1 COLORTERM=truecolor XDG_CONFIG_DIRS=/etc/xdg/xdg-kde:/etc/xdg

توضیح: printenv لیست متغیرهای محیطی (Global) را نمایش می‌دهد.

echo $VAR (نمایش یک متغیر خاص)

برای نمایش مقدار یک متغیر خاص، از echo $VAR استفاده کنید.

┌──(ya3in㉿kali)-[~] └─$ echo $HOME /home/ya3in

▍ تفاوت Local و Global در عمل

بیایید با یک مثال عملی تفاوت را ببینیم:

┌──(ya3in㉿kali)-[~] └─$ local_var="I am local" └─$ export global_var="I am global" └─$ bash └─$ echo $local_var (خالی) └─$ echo $global_var I am global

توضیح: متغیر Local در شل جدید قابل دسترس نیست، اما متغیر Global قابل دسترس است.

✅ جمع‌بندی نهایی:
  • متغیرها: محل ذخیره اطلاعات در RAM.
  • Local: فقط در همان شل قابل دسترس است.
  • Global: با export ساخته می‌شود و به شل‌های فرزند ارث‌بری می‌شود.
  • تعریف: myvar="value" (بدون فاصله)
  • دسترسی: با $ (مثل $myvar)
  • مشاهده Global: printenv یا env
  • تبدیل Local به Global: export myvar